/*
 * Main.cpp
 *
 *  Created on: 25.01.2013
 *      Author: Maksim Lazeba
 */

#include <vector>
#include "my_structs.h"
#include "convex_hull.h"
#include <iostream>

typedef std::vector<point_t> points_t;

void print(std::ostream& out, point_t a, point_t b)
{
	out.precision(30);
	out << a.x << " " << a.y << "\n";
	out << b.x << " " << b.y << "\n";
}

struct convex_hull
{
	points_t& points;

	convex_hull(points_t& p) :
			points(p)
	{
	}
	;

	points_t::iterator begin()
	{
		return points.begin();
	}

	points_t::iterator end()
	{
		return points.end();
	}

	points_t::iterator next(points_t::iterator i)
	{
		auto j = i + 1;
		if (j == points.end())
			return points.begin();
		return j;
	}
};

int main()
{
	points_t points;

	int n;
	std::cin >> n;

	for (int i = 0; i < n; i++)
	{
		point_t p;
		std::cin >> p;
		points.push_back(p);
	}

	points_t ch = get_convex_hull(points);
	convex_hull hull(ch);

	point_t ans_a = *hull.begin();
	point_t ans_b = *hull.next(hull.begin());

	if (hull.points.size() < 3)
	{
		print(std::cout, ans_a, ans_b);
		return 0;
	}

	auto c = hull.begin();

	for (auto a = hull.begin(); a < hull.end(); a++)
	{
		auto b = hull.next(a);

		while (left_turn(*a,*b,*c,*(hull.next(c))) >= 0)
		{
			c = hull.next(c);
		}

		if (compare_dist(ans_a,ans_b,*a,*c) < 0)
		{
			ans_a = *a;
			ans_b = *c;
		}
	}

	print(std::cout, ans_a, ans_b);
}

